#include "Args.h"

#include <iostream>

#include "MyPrtFns.h"
#include "clipp/clipp.h"

namespace
{
    // 辅助函数：获取程序名称（不包含路径）
    std::string getProgramName(const char* argv0)
    {
        std::string fullPath(argv0);
        size_t lastSlash = fullPath.find_last_of("/\\");
        if (lastSlash != std::string::npos)
        {
            return fullPath.substr(lastSlash + 1);
        }
        return fullPath;
    }
}  // namespace

// 私有构造函数
Args::Args() { initParser(); }

// 获取单例实例
Args& Args::getInstance()
{
    static Args instance;
    return instance;
}

// 初始化命令行解析器
void Args::initParser()
{
    using clipp::command, clipp::option, clipp::value;

    // 创建te_dosestat子命令
    auto teDosestatCmd = (command("te_dosestat").set(_commandType, CommandType::TE_DOSESTAT),
                          option("-v").doc("指定体素数据文件路径") & value("volume_path", _volumePath),
                          option("-d").doc("指定剂量数据文件路径") & value("dose_path", _dosePath));

    // 创建帮助选项
    auto helpOpt = (option("-h", "--help").set(_commandType, CommandType::HELP).doc("显示帮助信息"));

    // 组合所有命令和选项
    _cliParser = std::make_unique<clipp::group>((teDosestatCmd | helpOpt));
}

// 解析命令行参数
bool Args::parse(int argc, char** argv)
{
    if (argc < 1)
    {
        return false;
    }

    _programName = getProgramName(argv[0]);
    auto ret = clipp::parse(argc, argv, *_cliParser, 1);

    return static_cast<bool>(ret);
}

// 打印帮助信息
void Args::printHelp() const
{
    using std::cout;

    cout << "用法: " << _programName << " [命令] [选项]\n";
    cout << "命令和选项:\n";
    cout << make_man_page(*_cliParser, _programName) << std::endl;

    cout << "可用命令:\n";
    cout << "  te_dosestat  -v <volume_path> -d <dose_path>  运行剂量统计测试\n";
    cout << "选项:\n";
    cout << "  -h, --help                     显示此帮助信息\n";
}